/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "轴视口工作区.h"

#include "时间轴.h"
#include "曲线视口工作区.h"

#include "A_引擎/文件工程/工程文件.h"
#include "异步解算/物理异步解算.h"
#include "../ui属性栏.h"


using namespace std;



static float64 gdur;
static clock_t g时间start = clock();
static clock_t g时间end;



static S_Operator* g_Ops播放;
static S_Operator* g_Ops停止;

static S_Operator* g_Ops前一帧;
static S_Operator* g_Ops后一帧;




static C_状态条* g时间轴主状态条 = nullptr;






void f_当前帧PropUpdate(S_Props& prop) {
	//if (g_当前时间轴页面) {
	//	g_当前时间轴页面->f_刷新时间帧绘制();
	//}
}





bool f_工作区_播放时间帧(bool 是否播放) {
	S_框架::g_播放帧 = 是否播放;

	return false;
}

//播放帧动画是会调用此函数
static bool f_时间轴工作区_帧步进(int8 方向) {
	S_时间帧& f = f_NodeCtx_get帧();
	
	f_node_帧更新(true);
	//if (时间是否步进) {
	f_prop_I32(f.当前帧) += 方向;
	f_NodeCtx_set场景当前时间(f_prop_I32(f.当前帧));

	if(f.当前帧.m_UI->m_部件) f.当前帧.m_UI->m_Set(f.当前帧);
	f_ob_步进时间帧(方向);

	for (auto& e : C_时间轴::g_当前时间轴页面) {
		if (!e->m_被裁剪) {
			e->f_刷新时间帧绘制();
		}
	}

	f_页面_更新联动工作区(E_工作区类型::e_时间轴);

	return true;
}


static void on_播放控制(S_Props& prop) {
	switch (f_prop_enum(prop)) {
	case 0: {
		S_框架::g_播放帧 = false;
		f_时间轴工作区_帧步进(-1);
		f_时间轴_更新状态栏(true);
		break;
	}
	case 1: {
		//auto* f = f_projectFile_取当前工程文件();
		S_框架::g_播放帧 = false;
		f_时间轴_更新状态栏(S_框架::g_播放帧);
		f_node_帧更新(S_框架::g_播放帧);
		break;
	}
	case 2: {
		S_框架::g_播放帧 = true;
		f_时间轴_更新状态栏(S_框架::g_播放帧);
		f_node_帧更新(S_框架::g_播放帧);
		break;
	}
	case 3: {
		S_框架::g_播放帧 = false;
		f_时间轴工作区_帧步进(1);
		f_时间轴_更新状态栏(true);
		break;
	}
	default:
		break;
	}
	//f_时间轴_帧绘制更新(g播放);
}


static void on_模型显示模式控制(S_Props& prop) {

	switch (f_prop_enum(prop)) {
	case 0: {
		
		break;
	}
	case 1: {
		
		break;
	}
	}

}


C_工作区页面* f_工作区_时间轴视口create(S_UI创建环境& ctx) {
	
	auto* view = f_创建时间轴页面(ctx);
	auto* f = f_projectFile_取当前工程文件();

	C_状态条* tool = new C_状态条(ctx);
	if (g时间轴主状态条 == nullptr) {
		g时间轴主状态条 = tool;
	}
	{
		std::vector<S_Props> props;
		S_Props	prop;

		prop = f_alloc_NoneProp();
		props.push_back(prop);

		prop = f_alloc_EnumProp(nullptr,
			{ {L"倒放一帧", "左一帧"}, {L"暂停", "暂停"}, {L"播放", "playback_play"}, {L"前放一帧", "右一帧"} },
			L"播放控制", 
			0, 
			on_播放控制);
		props.push_back(prop);
		
		prop = f_alloc_NoneProp();
		props.push_back(prop);
		
		//f_NodeCtx_get帧().当前帧.m_UI->m_LinkWidget->clear();
		//f_NodeCtx_get帧().当前帧.m_UI->m_Update = f_当前帧PropUpdate;
		props.push_back(f_NodeCtx_get帧().当前帧);
		props.push_back(f_NodeCtx_get帧().帧区间);
		//
		props.push_back(S_NodeCtx_模拟计算::g_是否开启解算);

		
		tool->f_构建属性部件(props, g时间轴主状态条);

	}

	C_工作区页面* 工作区 = new C_工作区页面(E_工作区类型::e_时间轴, ctx, E_方向::e_横向, view, tool);
	return 工作区;
}













bool f_工作区_时间步进() {
	f_scene_设置光追渲染器渲染(f_NodeCtx_get默认场景(), false);

	if (f_NodeCtx_更新()) {
		//std::cout<<"不更新节点"<<std::endl;
		auto& frame  = f_NodeCtx_get帧();
		int32 当前帧 = f_prop_I32(frame.当前帧);
		auto 区间    = f_prop_iVec2(frame.帧区间);
	

		if (S_光追后端::g_渲染状态 == E_离线渲染状态::e_光追渲染_关) {
			if (S_框架::g_播放帧) {
				int32 方向 = 1;
				//std::cout << "方向 = " << 方向 << std::endl;
				g时间end = clock();
				gdur = (double)(g时间end - g时间start);
				gdur = (gdur * 1000 / CLOCKS_PER_SEC);

				if (gdur >= 16.666) {
					g时间start = clock();
				}
				else {
					f_NodeCtx_停止更新();
					return false;
				}

			
				if (f_时间轴工作区_帧步进(方向)) {
					if (当前帧 >= f_prop_iVec2(frame.帧区间).y) {
						f_prop_I32(frame.当前帧) = f_prop_iVec2(frame.帧区间).x;
						f_ob_set步进时间帧(f_prop_iVec2(frame.帧区间).x);
					}
					else {
						f_NodeCtx_start模拟步数();
					}


					frame.当前帧.m_UI->m_Set(frame.当前帧);
					f_node_Step节点树();
				}

			
				f_NodeCtx_stop模拟步数();
			} else {
				f_NodeCtx_stop模拟步数();
				f_node_Step节点树();

				f_页面_更新联动工作区(E_工作区类型::e_时间轴);
			}

			f_scene_设置光追渲染器渲染(f_NodeCtx_get默认场景(), true);
		}

		f_NodeCtx_停止更新();
		return false;
	}
	return true;
}





E_事件是否传递 f_工作区_播放时间帧(C_Widget* self, uint8 状态) {
	//cout << "f_工作区_播放时间帧 = " << f_工作区_播放时间帧 << endl;
	S_框架::g_播放帧 = !S_框架::g_播放帧;

	f_node_帧更新(S_框架::g_播放帧);

	f_时间轴_更新状态栏(S_框架::g_播放帧);
	//f_prop_Bool(S_NodeCtx_模拟计算::g_节点解算) = g播放;
	//f_ob_set步进时间帧(f_prop_iVec2(f.帧区间).x);
	return E_事件是否传递::e_事件传递_终止;
}



E_事件是否传递 f_工作区_时间帧步进(C_Widget* self, uint8 状态) {
	f_node_帧更新(true);
	f_时间轴工作区_帧步进(-C_Widget::g_鼠标.lZ);
	//f_曲线视口页面_联动更新();
	//std::cout << "方向 = " << C_Widget::g_鼠标.lZ << std::endl;
	return E_事件是否传递::e_事件传递_终止;
}

void f_时间轴页面_联动更新() {
	for (auto& e : C_时间轴::g_当前时间轴页面) {
		if (!e->m_被裁剪) {
			e->f_刷新时间帧绘制();
		}
	}
}

void f_时间轴页面_销毁() {
	C_时间轴::g_当前时间轴页面.clear();
}

